SSTACK  SEGMENT STACK
        DB 32 DUP(?)            ; reserve 32 bytes for stack

SSTACK  ENDS

CODE    SEGMENT
        ASSUME CS:CODE

START:  PUSH DS
        MOV AX, 0000H
        MOV DS, AX              ; DS = 0
        MOV AX, OFFSET MIR7     ; 取中断程序入口地址
        MOV SI, 0084H           ; 中断矢量地址
        MOV [SI], AX            ; 将中断程序入口地址送入中断矢量表
        MOV AX, CS              ; 取当前段地址
        MOV SI, 0086H           ; 中断程序段地址
        MOV [SI], AX            ; 将中断程序段地址送入中断矢量表
        CLI                     ; 关中断
        POP DS


        ; 初始化主片 8259 相关寄存器
        MOV AL, 11H             ; ICW1
        OUT 20H, AL             ; 主片 ICW1，设置边沿触发

        MOV AL, 08H             ; ICW2
        OUT 21H, AL             ; 主片 ICW2，低三位根据设置的IR自动填入 0000 1000

        MOV AL, 04H             ; ICW3
        OUT 21H, AL             ; 主片 ICW3，IR2 对应从片

        MOV AL, 01H             ; ICW4
        OUT 21H, AL             ; 主片 ICW4，8086模式

        MOV AL, 6FH             ; OCW1 0110 1111 开放4号中断串口用，7号中断实验用
        OUT 21H, AL             ; 主片 OCW1

        STI                     ; 开中断
        JMP AA1                 ; 无限循环，等待中断信号

AA1:    NOP                     ; 延时程序
        JMP AA1                 ; 无限循环，等待中断信号

; 中断处理程序
MIR7:   STI                     ; 开中断
        CALL DELAY              ; 延时

        MOV AH, 02H
        MOV DL, 4DH             ; ASCII 码 M
        INT 21H                 ; 调用 8086 系统 10 号中断显示字符，把 AL 的值对应的 ASCII 码显示在屏幕上
        MOV AH, 02H
        MOV DL, 17H             ; ASCII 码 7
        INT 21H                 ; 调用 8086 系统 10 号中断显示字符，把 AL 的值对应的 ASCII 码显示在屏幕上

        MOV AH, 4CH             ; 退出程序
        INT 21H                 ; 调用 8086 系统 21 号中断退出程序

        MOV AL, 20H
        OUT 20H, AL             ; OCW2，结束中断
        IRET                    ; 中断返回

DELAY:  PUSH CX
        MOV CX, 00F0H

AA0:    PUSH AX
        POP AX
        LOOP AA0                ; 循环 00F0H 次，相当于延时
        POP CX
        RET                     ; 返回

CODE    ENDS
        END START